package com.atguigu.daijia.driver.service.impl;

import com.alibaba.nacos.common.utils.StringUtils;
import com.atguigu.daijia.driver.config.TencentCloudProperties;
import com.atguigu.daijia.driver.service.CiService;
import com.atguigu.daijia.model.vo.order.TextAuditingVo;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.ciModel.auditing.*;
import com.qcloud.cos.region.Region;
import jakarta.annotation.Resource;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CiServiceImpl implements CiService {

    @Resource
    private TencentCloudProperties tencentCloudProperties;

    /**
     * 对指定路径的图片进行审核
     *
     * @param path 图片的路径
     * @return 如果图片内容包含违规信息（色情、广告、暴恐、政治等），则返回false；否则返回true
     */
    @Override
    public Boolean imageAuditing(String path) {
        // 获取私有COS客户端实例
        COSClient client = getPrivateCOSClient();

        // 创建图片审核请求对象
        ImageAuditingRequest request = new ImageAuditingRequest();

        // 设置请求中的桶名为配置的私有桶名
        request.setBucketName(tencentCloudProperties.getBucketPrivate());

        // 设置请求中的对象键（图片路径）为传入的path参数
        request.setObjectKey(path);

        // 执行图片审核请求，并获取响应对象
        ImageAuditingResponse response = client.imageAuditing(request);

        // 检查响应中各类违规信息的命中标识，如果有任一标识不为"0"，则表示有违规内容，返回false
        if (!response.getPornInfo().getHitFlag().equals("0")
                || !response.getAdsInfo().getHitFlag().equals("0")
                || !response.getTerroristInfo().getHitFlag().equals("0")
                || !response.getPoliticsInfo().getHitFlag().equals("0")
        ){
            return false;
        }

        // 如果所有违规信息的命中标识都为"0"，则表示没有违规内容，返回true
        return true;
    }


    /**
     * 文本内容违规检测方法
     * 该方法用于检测给定的文本内容是否违反相关规则，包括垃圾广告、涉黄、涉毒等信息的检测
     *
     * @param content 待检测的文本内容
     * @return TextAuditingVo 返回一个包含检测结果的对象，其中包含是否违规的标志和关键词等信息
     */
    @Override
    public TextAuditingVo textAuditing(String content) {
        // 检查输入的文本内容是否为空或不包含有效文本
        if(!StringUtils.hasText(content)) {
            // 如果文本为空，则创建一个新的TextAuditingVo对象，设置结果为"0"，表示文本为空或无效
            TextAuditingVo textAuditingVo = new TextAuditingVo();
            textAuditingVo.setResult("0");
            return textAuditingVo;
        }
        // 获取私有COS（Cloud Object Storage）客户端实例
        COSClient client = getPrivateCOSClient();
        // 创建一个新的文本违规检测请求对象
        TextAuditingRequest request = new TextAuditingRequest();
        // 设置请求中的Bucket名称
        request.setBucketName(tencentCloudProperties.getBucketPrivate());
        // 将文本内容转换为Base64编码格式
        byte[] encoder = Base64.encodeBase64(content.getBytes());
        String contentBase64 = new String(encoder);
        // 将Base64编码后的文本内容设置到请求对象中
        request.getInput().setContent(contentBase64);
        // 设置检测配置中的检测类型为"all"，表示进行全面的违规检测
        request.getConf().setDetectType("all");
        // 发送请求，执行文本违规检测
        TextAuditingResponse response = client.createAuditingTextJobs(request);
        // 获取检测响应中的详细信息
        AuditingJobsDetail detail = response.getJobsDetail();
        // 创建一个新的文本违规检测结果对象
        TextAuditingVo textAuditingVo = new TextAuditingVo();
        // 检查检测状态是否为"Success"，即检测成功
        if("Success".equals(detail.getState())){
            // 使用StringBuilder来构建可能的违规关键词字符串
            StringBuilder sb = new StringBuilder();
            // 获取检测结果中的所有段落信息
            List<SectionInfo> sectionList = detail.getSectionList();
            // 遍历每个段落信息，提取其中的违规关键词
            sectionList.forEach(item -> {
                String abuseKeywords = item.getAbuseInfo().getKeywords(); // 获取谩骂类关键词
                String adsKeywords = item.getAdsInfo().getKeywords(); // 获取广告类关键词
                String pornKeywords = item.getPornInfo().getKeywords(); // 获取涉黄类关键词
                String illegalKeywords = item.getIllegalInfo().getKeywords(); // 获取违法类关键词
                // 如果关键词不为空，则追加到StringBuilder中，不同类关键词之间用逗号分隔
                if(abuseKeywords.length() > 0) sb.append(abuseKeywords).append(",");
                if(adsKeywords.length() > 0) sb.append(adsKeywords).append(",");
                if(pornKeywords.length() > 0) sb.append(pornKeywords).append(",");
                if(illegalKeywords.length() > 0) sb.append(illegalKeywords).append(",");
            });
            // 将检测结果和关键词字符串设置到结果对象中
            textAuditingVo.setResult(detail.getResult());
            textAuditingVo.setKeywords(sb.toString());
        }
        // 返回文本违规检测结果对象
        return textAuditingVo;
    }

    private COSClient getPrivateCOSClient() {
        COSCredentials cred = new BasicCOSCredentials(tencentCloudProperties.getSecretId(),
                tencentCloudProperties.getSecretKey());
        Region region = new Region(tencentCloudProperties.getRegion());
        ClientConfig clientConfig = new ClientConfig(region);
        clientConfig.setHttpProtocol(HttpProtocol.https);
        return new COSClient(cred, clientConfig);
    }
}
